<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=665540
-->
<head>
  <title>Test for Bug 665540 Select dropdown position in fullscreen window</title>
  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
</head>
<body onload="openFullscreenWindow()">
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=665540">Mozilla Bug 665540</a>
<p id="display"></p>
<div id="content" style="display: none">
  
</div>
<pre id="test">
<script type="application/javascript">

/** Test for Bug 665540 **/

SimpleTest.waitForExplicitFinish();

var win;
var select;
var optiona;
var eventType = "mouseover";
var timeoutID;
var eventOffsetX = 2;
var eventOffsetY = 2;

function openFullscreenWindow() {
    win = open("bug665540_window.xul", "_blank", "resizable=yes,chrome");
    win.addEventListener("sizemodechange",
                         function() {
                           info("sizemodechange. windowState = " + win.windowState + " fullScreen = " + win.fullScreen);
                         }, false);
    win.addEventListener("fullscreen",
                         function() {
                           info("fullscreen event. windowState = " + win.windowState + " fullScreen = " + win.fullScreen);
                         }, false);
    info("win.windowState = " + win.windowState);
    info("win.fullScreen = " + win.fullScreen);

    // Close our window if the test times out so that it doesn't interfere
    // with later tests.
    timeoutID = setTimeout(function () {
        ok(false, "Test timed out.");
        // Provide some time for a screenshot
        setTimeout(finish, 1000);
    }, 20000);
}

function childFocused() {
    ok(win.fullScreen, "window should be fullscreen");
    is(win.windowState, win.STATE_FULLSCREEN,
       "window state should be fullscreen");

    // The select doesn't open if the mouse click is fired too soon
    // (on X11 at least).
    setTimeout(openSelect, 1000);
}

function openSelect() {
    select = win.document.getElementById("select");
    synthesizeMouseAtCenter(select, {}, win);
    // A yield was required on X11 tinderbox machines.
    // (Wasn't required on other platforms nor on an X11 system with kwin.)
    setTimeout(checkPosition, 1000);
}

function checkPosition() {
    optiona = win.document.getElementById("optiona");
    optiona.addEventListener(eventType, eventReceived, false);

    // If the select dropdown is opened in the position where
    // getBoundingClientRect() predicts, then optiona will receive the event.
    // The event is received asynchronously (I don't know why), so the handler
    // is removed later.
    synthesizeMouse(optiona, eventOffsetX, eventOffsetY,
                    { type: eventType }, win);
}

function eventReceived(event) {
    clearTimeout(timeoutID);
    optiona.removeEventListener(eventType, eventReceived, false);

    var rect = optiona.getBoundingClientRect();

    // Note that fullscreen only fully covers one monitor, so win.screenX can
    // be non-zero.
    is(event.screenX, win.screenX + rect.left + eventOffsetX,
       "event.screenX should match sent event");
    is(event.screenY, win.screenY + rect.top + eventOffsetY,
       "event.screenY should match sent event");

    finish();
}

function finish() {
    if (select && navigator.platform.indexOf("Win") >= 0) {
        todo(false,
             "Should not have to close select before closing its window");
        // This avoids mochitest "Unable to restore focus" errors (bug 670053).
        synthesizeMouseAtCenter(select, {}, win);
    }

    is(win.windowState, win.STATE_FULLSCREEN,
       "window state should still be fullscreen");

    win.close();
    SimpleTest.finish();
}
</script>
</pre>
</body>
</html>
